package com.empire.module.member.service.warninggatherperson;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.empire.module.member.dal.dataobject.warninggather.WarningGatherDO;
import com.empire.module.member.dal.mysql.warninggather.WarningGatherMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;

import com.empire.module.member.controller.admin.warninggatherperson.vo.*;
import com.empire.module.member.dal.dataobject.warninggatherperson.WarningGatherPersonDO;
import com.empire.framework.common.pojo.PageResult;
import com.empire.framework.common.util.object.BeanUtils;

import com.empire.module.member.dal.mysql.warninggatherperson.WarningGatherPersonMapper;

import javax.annotation.Resource;

import java.util.List;

import static com.empire.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.empire.module.member.enums.ErrorCodeConstants.*;

/**
 * 聚集预警参与人员关联表（1条记录对应1人参与1次聚集） Service 实现类
 *
 * @author 主席大人
 */
@Service
@Validated
public class WarningGatherPersonServiceImpl implements WarningGatherPersonService {

    @Resource
    private WarningGatherPersonMapper warningGatherPersonMapper;
    @Resource
    private WarningGatherMapper warningGatherMapper;

    @Override
    public Long createWarningGatherPerson(WarningGatherPersonSaveReqVO createReqVO) {
        // 插入
        WarningGatherPersonDO warningGatherPerson = BeanUtils.toBean(createReqVO, WarningGatherPersonDO.class);
        warningGatherPersonMapper.insert(warningGatherPerson);
        // 返回
        return warningGatherPerson.getId();
    }

    @Override
    public void updateWarningGatherPerson(WarningGatherPersonSaveReqVO updateReqVO) {
        // 校验存在
        validateWarningGatherPersonExists(updateReqVO.getId());
        // 更新
        WarningGatherPersonDO updateObj = BeanUtils.toBean(updateReqVO, WarningGatherPersonDO.class);
        warningGatherPersonMapper.updateById(updateObj);
    }

    @Override
    public void deleteWarningGatherPerson(Long id) {
        // 校验存在
        validateWarningGatherPersonExists(id);
        // 删除
        warningGatherPersonMapper.deleteById(id);
    }

    private void validateWarningGatherPersonExists(Long id) {
        if (warningGatherPersonMapper.selectById(id) == null) {
            throw exception(WARNING_GATHER_PERSON_NOT_EXISTS);
        }
    }

    @Override
    public WarningGatherPersonDO getWarningGatherPerson(Long id) {
        return warningGatherPersonMapper.selectById(id);
    }

    @Override
    public PageResult<WarningGatherPersonDO> getWarningGatherPersonPage(WarningGatherPersonPageReqVO pageReqVO) {
        return warningGatherPersonMapper.selectPage(pageReqVO);
    }

    /**
     * 单条标记已读：更新is_read为1
     */
    @Override
    public void markSingleRead(Long id) {
        // 1. 校验记录是否存在
        WarningGatherPersonDO personDO = warningGatherPersonMapper.selectById(id);
        if (personDO == null) {
            throw exception(WARNING_GATHER_PERSON_NOT_EXISTS); // 需自定义"记录不存在"的错误码
        }
        // 2. 已读无需重复更新
        if (personDO.getIsRead() == 1) {
            return;
        }
        // 3. 更新is_read字段
        LambdaUpdateWrapper<WarningGatherPersonDO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.eq(WarningGatherPersonDO::getId, id)
                .set(WarningGatherPersonDO::getIsRead, 1); // 标记为已读
        warningGatherPersonMapper.update(null, updateWrapper);
        // 4、如果全部已读，那么修改主表is_read=1
        updateWarnGatherReadFinish(personDO.getGatherId());
    }

    private void updateWarnGatherReadFinish(Long gatherId) {
        LambdaQueryWrapper<WarningGatherPersonDO> queryMapper = new LambdaQueryWrapper<>();
        queryMapper.eq(WarningGatherPersonDO::getGatherId, gatherId);
        queryMapper.eq(WarningGatherPersonDO::getIsRead, 0);
        if (warningGatherPersonMapper.selectCount(queryMapper) == 0) {
            LambdaUpdateWrapper<WarningGatherDO> updateMainWrapper = new LambdaUpdateWrapper<>();
            updateMainWrapper.eq(WarningGatherDO::getId, gatherId)
                    .set(WarningGatherDO::getIsRead, 1); // 标记为已读
            warningGatherMapper.update(null, updateMainWrapper);
        }
    }

    /**
     * 批量标记已读：批量更新is_read为1（事务保证原子性）
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void markBatchRead(List<Long> ids) {
        if (ids == null || ids.isEmpty()) {
            return;
        }
        // 批量更新：仅更新未读的记录（is_read=0）
        LambdaUpdateWrapper<WarningGatherPersonDO> updateWrapper = new LambdaUpdateWrapper<>();
        updateWrapper.in(WarningGatherPersonDO::getId, ids)
                .eq(WarningGatherPersonDO::getIsRead, 0) // 只更新未读的
                .set(WarningGatherPersonDO::getIsRead, 1); // 标记为已读
        warningGatherPersonMapper.update(null, updateWrapper);

        WarningGatherPersonDO personDO = warningGatherPersonMapper.selectById(ids.getFirst());
        updateWarnGatherReadFinish(personDO.getGatherId());
    }

}